package org.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;

public class ProxyFactory {



    public Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }


    public Object getProxyInstance() {

        /**
         *  public static Object newProxyInstance(ClassLoader loader,
         Class<?>[] interfaces,
         InvocationHandler h)

         1. ClassLoader loader :指定当前目标对象使用的类加载器,获取加载器的方法固定
         2. Class<?>[] interfaces:目标对象实现的接口类型
         3. InvocationHandler h: 方法调用处理器,执行目标对象的方法时,会触发该处理器,进入invoke方法,
                                                会把当前执行的目标对象方法作为参数传入
         */
      return   Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {

          /**
           *
           * @param proxy  就是生成的代理对象,通过hashCode值可判断
           * @param method  代理的方法名
           * @param args     参数
           * @return
           * @throws Throwable
           */

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("InvocationHandler类中的invoke方法执行了,jdk代理开始,代理方法:"+method.getName()+"----proxy的hashCode="+System.identityHashCode(proxy));

               //针对特定方法做事情
                if (method.getName().equals("teach")) {
                    System.out.println("只针对teach方法,特定增强.");
                }

                AppJdkProxyTest.argListMap = new HashMap<>();

                AppJdkProxyTest.argListMap.put(method, args);

                //反射机制调用目标对象的方法
//                Object returnVal = method.invoke(target, args);
//                return returnVal;
                return null;
            }
        });

    }
}
